package org.qqcui.designpattern.principles.ocp;

/**
 * 开闭原则示例一，违反开闭原则的情况
 * 对扩展开放（提供方），对修改关闭（对使用方）
 * 方法一的优缺点
 * 1）优点是比较好理解，简单易操作。
 * 2）缺点是违反了设计模式的ocp 原则，即对扩展开放(提供方)，对修改关闭(使用方)。
 * 即当我们给类增加新功能的时候，尽量不修改代码，或者尽可能少修改代码.
 * 比如我们要新增加一个图形种类：三角形，需要修改的地方较多(使用方的代码也被修改了)，代码如下。
 *
 * @author cuiqingqiang
 * @version 1.0
 * @date 2020-10-14 21:17
 **/
public class Ocp1 {
	public static void main(String[] args) {
		GraphicEditor graphicEditor = new GraphicEditor();
		graphicEditor.draw(new Rectangle());
		graphicEditor.draw(new Circle());
		// 新增绘制三角形调用
		graphicEditor.draw(new Triangle());
	}
}

/**
 * 图形绘制类，对于图形类来说，是使用方
 */
class GraphicEditor {
	public void draw(Shape s) {
		if (s.shapeType == 1) {
			drawRectangle();
		} else if (s.shapeType == 2) {
			drawCircle();
		} else if (s.shapeType == 3) {
			drawTriangle();
		}
	}

	public void drawRectangle() {
		System.out.println("绘制矩形");
	}

	public void drawCircle() {
		System.out.println("绘制圆形");
	}

	/**
	 * 新增绘制三角形
	 */
	public void drawTriangle() {
		System.out.println("绘制三角形");
	}
}

/**
 * 图形基类
 */
class Shape {
	int shapeType;
}

/**
 * 矩形类
 */
class Rectangle extends Shape {
	Rectangle() {
		super.shapeType = 1;
	}
}

/**
 * 圆形类
 */
class Circle extends Shape {
	Circle() {
		super.shapeType = 2;
	}
}

/**
 * 新增三角形类
 */
class Triangle extends Shape {
	Triangle() {
		super.shapeType = 3;
	}
}